'''
    生词本中包含用户模块和单词记录模块,启动程序后会优先执行用户模块,只有当用户输入正确的用户名和密码后才可以跳转到单词记录模块,
因此我们可以优先实现用户模块中的功能
    首先创建login.py文件,然后在该文件中创建User类表示用户模块,接着在User类型中定义展示用户模块功能的方法,
'''

import os
class User:
    # 功能展示
    def welcom(self):
        print('欢迎使用生词本')
        print('1.用户注册')
        print('2.用户登录')
        print('3.用户注销')
        print('4.修改密码')
        print('5.退出')
        while True:
            option = input('请选择功能:\n')
            # 用户注册
            if option == '1':
                self.register()
            # 用户登录
            if option == '2':
                self.login()
            # 注销
            if option == '3':
                self.cancel()
            # 修改密码
            if option == '4':
                self.modify()
            if option == '5':
                print('谢谢使用')
                break
    '''
    因为用户模块中的数据是保存在info.txt中,所以在注册前需要先判断info.txt文件是否存在,如果存在则将用户注册的数据写入info.txt中,如果不存在则创建info.txt文件
并将用户注册数据写入info.txt中.
    '''
    # def register(self):
    #     if os.path.exists('info.txt') is not True:
    #         with open('info.txt',mode= 'w',encoding='utf_8') as f:
    #             f.write('')
    #     # 接收注册信息
    #     person_info = dict()
    #     name = input('请输入注册用户名:\n')
    #     password = input('请输入注册密码:\n')
    #     person_info['姓名'] = name
    #     person_info['密码'] = password
    #     # 写入注册信息
    #     with open('info.txt',mode='a+',encoding='utf-8') as info_data:
    #         info_data.write(str(person_info)+'\n')
    '''
    为保证用户注册的唯一性,还需要对用户注册的用户名进行校验,如果输入的用户名已经存在,则提示"用户名以存在".对于用户名的校验步骤是:读取info.txt文件中的数据,并将其
转换为python可识别的dict类型,在用户注册时,获取用户名数据,判断用户注册的用户名是否存在.对info.txt文件数据转换具体代码如下:
    '''
    def convert_data(self):
        '''现在，我们以文件第一行 "{'姓名': '张三', '密码': '123'}\n" 为例，一步步展示运行结果：'''
        info_li = []
        with open('info.txt',mode='r+',encoding='utf-8') as f:
            info_data = f.readlines()
            '''假设文件只有一行数据，info_data 是一个列表：["{'姓名': '张三', '密码': '123'}\n"]'''
            for i in info_data:
                '''  运行结果: i = "{'姓名': '张三', '密码': '123'}\n"  '''
                info_dict = {}
                # 替换{和}并去掉空格
                step_one = i.replace('{','').replace('}','')
                '''移除 { 和 } 后，字符串变为 "'姓名': '张三', '密码': '123'\n"。
                （注意：这里 '姓名' 和 '张三' 等是字符串的一部分，外部双引号仅用于表示，实际字符串内容是单引号包裹的。）'''
                # 以冒号进行分割
                step_two = step_one.split(':')
                '''分割后，step_two 是一个列表：["'姓名'", " '张三', '密码'", "'123'\n"]
                （解释：冒号分割出三个部分：索引 0 是 "'姓名'", 索引 1 是 " '张三', '密码'", 索引 2 是 "'123'\n"。)'''
                # 凭借字典
                info_dict['姓名'] = step_two[1].split(',')[0].replace("'",'').strip()
                '''step_two[1].split(','): 以逗号分割，生成列表 [" '张三'", " '密码'"]。
                   [0]（取第一个元素）: " '张三'"（包含空格和单引号）。
                   .replace("'", ''): 移除所有单引号，变为 " 张三"（带空格）。
                   .strip(): 去除两端空格，最终得到 "张三"。
                   运行结果: info_dict['姓名'] = "张三"'''
                info_dict['密码'] = step_two[2].split(',')[0].replace("'",'').strip()
                '''step_two[2].split(','): 以逗号分割，但该部分无逗号，所以生成单个元素的列表 ["'123'\n"]。
                   [0]: 取第一个元素 "'123'\n"。
                   .replace("'", ''): 移除单引号，变为 "123\n"。
                   .strip(): 去除换行符和空格，最终得到 "123"。
                   运行结果: info_dict['密码'] = "123"'''
                # 保存到列表中
                info_li.append(info_dict)
                '''当前 info_dict = {'姓名': '张三', '密码': '123'}，添加到列表。'''
        return info_li
    '''
    数据转换功能完成后,需要完善用户注册功能代码,具体代码如下:
    '''
    def register(self):
        if os.path.exists('info.txt') is not True:
            with open('info.txt',mode='w',encoding='utf-8') as f :
                f.write('')
        # 用户名列表
        name_li = []
        info_li = self.convert_data()
        # 接收注册信息
        person_info = {}
        name = input('请输入注册用户名:\n')
        # 获取用户名列表
        for i in info_li:
            name_li.append(i['姓名'])
        # 判断用户是否存在
        if name in name_li:
            print('用户名已存在')
        else:
            password = input('请输入注册密码:\n')
            person_info['姓名'] = name
            person_info['密码'] = password
            # 写入注册信息
            with open('info.txt',mode='a+',encoding='utf-8') as info_data:
                info_data.write(str(person_info)+'\n')
    '''
    用户登录功能主要判断用户输入的用户名和密码是否正确,如果输入正确则登录成功,否则提示用户"用户名或密码不正确".实现该功能的具体逻辑为:获取info.txt文件中的
用户数据,判断用户输入的用户名是否存在,如果存在,继续判断输入的密码是否正确.具体实现代码如下:
    '''
    def login(self):
        from recite import ReciteLogic
        if os.path.exists('info.txt') is not True:
            print('当前无数据,请先注册')
        else:
            # 用户名列表
            name_li = []
            info_li = self.convert_data()
            name = input('请输入登录用户名:\n')
            password = input('请输入登录密码:\n')
            # 获取用户名列表
            for i in info_li:
                name_li.append(i['姓名'])
            # 判断用户名是否存在
            if name in name_li:
                # 获取用户的索引
                modify_index = name_li.index(name)
                # 判断密码是否正确
                if password == info_li[modify_index]['密码']:
                    print('登录成功')
                else:
                    print('密码不正确')
            else:
                print('用户名不正确')


    '''
    用户注销功能是将info.txt文件中关于注销用户的信息进行删除.为了防止某些恶意注销,在用户注销时同样需要用户输入正确的用户名和密码,如果输入的用户名和密码
均正确则注销成功,否则提示"用户名或密码不正确".具体实现代码如下:
    '''
    def cancel(self):
        if os.path.exists('info.txt') is not True:
            print('当前无数据,请先注册')
        else:
            info_li = self.convert_data()
            name_li = []
            name = input('请输入想要注销的用户名:\n')
            password = input('请输入想要注销的用户密码:\n')
            for i in info_li:
                name_li.append(i['姓名'])
            if name in name_li:
                # 获取注销用户的索引
                modify_index = name_li.index(name)
                # 判断用户输入的密码是否正确
                if password == info_li[modify_index]['密码']:
                    info_li.pop(modify_index)
                    # 写入空数据
                    with open('info.txt',mode='w+',encoding='utf-8') as f:
                        f.write('')  # 清空 info.txt 中的所有数据,然后写入空数据
                    for i in info_li:
                        with open('info.txt',mode='a+',encoding='utf-8') as info_data:
                            info_data.write(str(i)+'\n') # 将info_li 中的剩余数据遍历出来写入info.txt
                    print('注销成功')
                else:
                    print('用户名或密码不正确')
            else:
                print('注销的用户不存在')
    '''
    修改密码功能与注销功能逻辑相同,首先获取修改密码的用户名和密码,然后判断输入的用户名和密码是否正确,若输入的用户名和密码均正确,则提示用户输入新的密码,将用户名与新密码
保存到info.txt文件中,否则提示"用户名或密码不正确".具体实现代码如下:
    '''
    def modify(self):
        if os.path.exists('info.txt') is not True:
            print('当前无数据,请先注册')
        else:
            name_li = []
            modify_name = input('请输入用户名:\n')
            old_password = input('请输入旧密码:\n')
            info_li = self.convert_data()
            for i in info_li:
                name_li.append(i['姓名'])
            if modify_name in name_li:
                modify_name_index = name_li.index(modify_name)
                if old_password == info_li[modify_name_index]['密码']:
                    new_password = input('请输入新密码:\n')
                    info_li[modify_name_index]['密码'] = new_password
                    with open('info.txt',mode='w+',encoding='utf-8') as info_data:
                        for i in info_li:
                            info_data.write(str(i)+'\n')
                    print('密码修改成功')
                else:
                    print('旧密码不正确')
            else:
                print('用户名不存在')

if __name__ == '__main__':
    p = User()
    p.welcom()

